Nginx est un logiciel de serveur web à code source ouvert, conçu dans un souci de haute concurrence, qui peut être utilisé comme serveur HTTP/HTTPS, serveur proxy inverse, serveur proxy de messagerie, équilibreur de charge logiciel, terminateur TLS, serveur de mise en cache et plus encore !
Il s'agit d'un logiciel très modulaire. Même certaines parties apparemment "intégrées" du logiciel, comme GZIP ou SSL, sont en fait créées en tant que modules qui peuvent être activés et désactivés au moment de la construction.
Il existe des modules de base (natifs) et des modules tiers (externes) créés par la communauté. Actuellement, il existe plus d'une centaine de modules tiers que nous pouvons utiliser.
Écrit en C, c'est un logiciel rapide et léger.
L'installation de Nginx à partir du code source est relativement simple : téléchargez la dernière version du code source de Nginx, configurez-la, construisez-la et installez-la.
Vous devrez choisir de télécharger la version principale ou une version stable, mais leur construction est la même.
Dans ce guide, nous allons compiler une version mainline de Nginx sur Debian 10 (buster). Nous utiliserons tous les modules disponibles dans la version open-source de Nginx.
Pourquoi compiler et installer Nginx à partir des sources ?
Vous vous demandez probablement pourquoi compiler Nginx à partir d'une source alors que vous pouvez utiliser des paquets préparés. Voici quelques raisons qui peuvent vous inciter à compiler vous-même un logiciel spécifique :
- Pour contrôler les options de configuration.
- Pour installer le logiciel où vous voulez. Vous pouvez même installer plusieurs versions différentes du même logiciel.
- Pour contrôler la version que vous installez. Les distributions ne sont pas toujours à jour avec les dernières versions de tous les paquets, en particulier les modules complémentaires aux paquets logiciels.
- Pour mieux comprendre le fonctionnement du logiciel.
Nginx Open Source est disponible en deux versions :
- Mainline - Comprend les dernières fonctionnalités et corrections de bogues et est toujours à jour. Elle est fiable, mais elle peut inclure certains modules expérimentaux et peut également comporter un certain nombre de nouveaux bogues.
- Stable - N'inclut pas toutes les dernières fonctionnalités, mais comporte des corrections de bogues critiques qui sont toujours reportées dans la version principale.
Nginx possède deux types de modules que vous pouvez utiliser : les modules de base et les modules tiers.
Les développeurs du noyau de Nginx créent les modules de base, qui font partie du logiciel lui-même.
La communauté construit des modules tiers et vous pouvez les utiliser pour étendre les fonctionnalités. Il existe un grand nombre de modules tiers utiles.
Les modules statiques existent dans Nginx depuis la toute première version. Les modules dynamiques ont été introduits avec Nginx 1.9.11+ en février 2016.
Avec les modules statiques, un ensemble de modules qui constituent un binaire Nginx est fixé au moment de la compilation par le script ./configure
Les modules statiques utilisent la syntaxe --with-foo_bar_module ou –add-module=PATH
Pour compiler un module de base (standard) comme dynamique, nous ajoutons =dynamic, par exemple --with-http_image_filter_module=dynamic.
Pour compiler un module tiers en dynamique, nous utilisons la syntaxe --add-dynamic-module=/path/to/module , puis nous les chargeons en utilisant la directive load_module dans le contexte global du fichier nginx.conf
En comparaison avec d'autres logiciels UNIX/Linux, Nginx est assez léger et ne dépend pas de beaucoup de bibliothèques. La configuration de construction par défaut ne dépend que de 3 bibliothèques à installer : OpenSSL/LibreSSL/BoringSSL, Zlib et PCRE.
NOTE: Nginx peut également être compilé avec les bibliothèques cryptographiques LibreSSL et BoringSSL au lieu d'OpenSSL.
Vérifiez la version de Debian.
lsb_release -ds
# Debian GNU/Linux 10 (buster)
Créez un utilisateur avec un accès sudo.
adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
NOTE : Remplacez johndoe par votre nom d'utilisateur.
Passez au nouvel utilisateur.
su - johndoe
Configurez le fuseau horaire.
sudo dpkg-reconfigure tzdata
Mettez à jour les logiciels de votre système d'exploitation.
sudo apt update && sudo apt upgrade -y
Installez les paquets nécessaires.
sudo apt install -y software-properties-common ufw
Nginx est un programme écrit en C, vous devrez donc d'abord installer un outil de compilation. Installez build-essential, git et tree.
sudo apt install -y build-essential git tree
Téléchargez la dernière version principale (mainline) du code source de Nginx et décompressez l'archive du code source. Le code source de Nginx est distribué sous forme d'archive compressée, comme la plupart des logiciels Unix et Linux.
wget https://nginx.org/download/nginx-1.17.2.tar.gz && tar zxvf nginx-1.17.2.tar.gz
Téléchargez le code source des dépendances obligatoires de Nginx et les extraire
# PCRE version 8.43
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz && tar xzvf pcre-8.43.tar.gz
# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz
# OpenSSL version 1.1.1c
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar xzvf openssl-1.1.1c.tar.gz
Installez les dépendances optionnelles de Nginx.
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev
Nettoyez tous les fichiers .tar.gz. Nous n'en avons plus besoin.
rm -rf *.tar.gz
Entrez le répertoire source de Nginx.
cd ~/nginx-1.17.2
Pour faire bonne mesure, listez les répertoires et les fichiers qui composent le code source de Nginx avec tree.
tree -L 2 .
Copiez la page de manuel dans /usr/share/man/man8/.
sudo cp ~/nginx-1.17.2/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Check that man page for Nginx is working
man nginx
Pour vous aider, vous pouvez voir une liste complète des options de compilation de Nginx en exécutant la commande suivante.
./configure --help
# To see want core modules can be built as dynamic run:
./configure --help | grep -F =dynamic
Configurer, compiler et installer Nginx.
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=Debian \
--builddir=nginx-1.17.2 \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-perl_modules_path=/usr/share/perl/5.26.1 \
--with-perl=/usr/bin/perl \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre=../pcre-8.43 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1c \
--with-openssl-opt=no-nextprotoneg \
--with-debug
make
sudo make install
Après la compilation, naviguez dans votre répertoire personnel (~).
cd ~
Faites un lien symbolique entre /usr/lib/nginx/modules et /etc/nginx/modules. Il s'agit d'un emplacement standard pour les modules Nginx.
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
Affiche la version de Nginx, la version du compilateur et les paramètres du script de configuration.
sudo nginx -V
# nginx version: nginx/1.17.2 (Debian)
# built by gcc 8.3.0 (Debian 8.3.0-6)
# built with OpenSSL 1.1.1c 28 May 2019
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules . . .
# . . .
# . . .
Créez un groupe et un utilisateur système Nginx.
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
# Check that user and group are created
sudo tail -n 1 /etc/passwd /etc/group /etc/shadow
Vérifiez la syntaxe de Nginx et les erreurs éventuelles.
sudo nginx -t
# Will throw this error -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)
# Create NGINX cache directories and set proper permissions
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*
# Re-check syntax and potential errors.
sudo nginx -t
Créer un fichier d'unité Nginx systemd.
sudo vim /etc/systemd/system/nginx.service
Remplissez le fichier /etc/systemd/system/nginx.service avec le contenu suivant.
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Activez le démarrage de Nginx au démarrage et démarrez Nginx immédiatement.
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
Vérifiez si Nginx s'initie automatiquement après un redémarrage.
sudo systemctl is-enabled nginx.service
# enabled
Vérifier le statut.
sudo systemctl status nginx.service
REMARQUE : vous pouvez vérifier que Nginx fonctionne en allant sur le domaine ou l'adresse IP de votre site dans un navigateur Web. Vous verrez la page de bienvenue de Nginx. C'est un indicateur que Nginx est en place et fonctionne sur votre VPS.
Créez un profil d'application UFW Nginx.
sudo vim /etc/ufw/applications.d/nginx
Copiez/collez le contenu suivant dans le fichier /etc/ufw/applications.d/nginx.
[Nginx HTTP]
title=Web Server (Nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp
[Nginx HTTPS]
title=Web Server (Nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp
[Nginx Full]
title=Web Server (Nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcp
Valider que les profils d'application UFW sont créés et reconnus.
sudo ufw app list
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
Nginx, par défaut, génère des fichiers de sauvegarde .default dans /etc/nginx. Supprimez les fichiers .default du répertoire /etc/nginx.
sudo rm /etc/nginx/*.default
Placez la coloration syntaxique de la configuration de Nginx pour l'éditeur Vim en ~/.vim.
# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.17.2/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.17.2/contrib/vim/* /root/.vim/
NOTE : En effectuant l'étape ci-dessus, vous obtiendrez une belle coloration syntaxique lors de l'édition des fichiers de configuration Nginx dans l'éditeur Vim.
Créer les répertoires conf.d, snippets, sites-available et sites-enabled dans /etc/nginx.
sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
Modifier les permissions et la propriété du groupe des fichiers journaux de Nginx.
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log
Créez une configuration de rotation des journaux pour Nginx.
sudo vim /etc/logrotate.d/nginx
Remplissez le fichier avec le texte suivant, puis enregistrez et quittez.
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Supprimez tous les fichiers téléchargés du répertoire personnel.
cd ~
rm -rf nginx-1.17.2/ openssl-1.1.1c/ pcre-8.43/ zlib-1.2.11/
Maintenant, vous avez la dernière version de Nginx installée. Elle est compilée de manière statique avec certaines bibliothèques importantes comme OpenSSL. Souvent, la version d'OpenSSL fournie par le système est obsolète. En utilisant cette méthode d'installation avec une version plus récente d'OpenSSL, vous pouvez profiter des chiffrements modernes comme CHACHA20_POLY1305 et des protocoles comme TLS 1.3 qui sont disponibles dans OpenSSL 1.1.1. De plus, en compilant votre propre binaire, vous êtes en mesure de personnaliser les fonctionnalités de votre Nginx, ce qui est beaucoup plus flexible que d'installer un binaire pré-construit.